package com.blueocean_health.care.management.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.blueocean_health.care.management.domain.base.Role;
import com.blueocean_health.care.management.domain.base.Team;
import com.blueocean_health.care.management.domain.base.UserAccount;
import com.blueocean_health.care.management.domain.base.UserTeam;
import com.blueocean_health.care.management.domain.vo.OrgAndProjectTreeParam;
import com.blueocean_health.care.management.domain.vo.OrganizationVo;
import com.blueocean_health.care.management.domain.vo.ProjectVo;
import com.blueocean_health.care.management.domain.vo.TeamVo;
import com.blueocean_health.care.management.util.MyMapper;

public interface TeamMapper extends MyMapper<Team> {

	/**
	 * 根据组织名称查询组织信息
	 * @param organizationVo
	 * @return
	 */
	OrganizationVo findFirstSubOrgByName(OrganizationVo organizationVo);

	/**
	 * 根据主键id查询组织信息
	 * @param id
	 * @return
	 */
	Team findOrgById(int id);

	/**
	 * 添加组织机构基本信息
	 * @param organizationVo
	 * @return
	 */
	int addOrgBase(OrganizationVo organizationVo);

	/**
	 * 批量添加组织全选模块中间表数据
	 * teamMapper
	 * @param organizationVo
	 */
	int addOrgModuleAllBase(OrganizationVo organizationVo);
	
	/**
	 * 批量添加组织半选模块中间表数据
	 * teamMapper
	 * @param organizationVo
	 */
	int addOrgModuleHalfBase(OrganizationVo organizationVo);

	/**
	 * 更新组织基本信息
	 * @param organizationVo
	 */
	int updateOrgBase(OrganizationVo organizationVo);

	/**
	 * 根据组织id获取详情
	 * @param map
	 * @return
	 */
	TeamVo queryOrg(Map<String, Object> map);

	/**
	 * 获取组织架构树
	 * @param orgId 
	 * @return
	 */
	List<com.blueocean_health.care.management.domain.vo.Param> tree(int orgId);
	
	/**
	 * 更新组织状态
	 * @param status
	 * @return
	 */
	int updateOrgStatusByCodeLike(@Param("subLikeCode")String subLikeCode, @Param("status")Integer status);
	
	/**
	 * 查询上级组织中是否存在启用/禁用组织
	 * @param upLikeCodeList
	 * @param string
	 * @return
	 */
	List<OrganizationVo> findUpperOrgLikeParentCodeListAndStatus(@Param("upLikeCodeList")List<String> upLikeCodeList, @Param("status")String status);
	
	/**
	 * 当前组织的所有下级列表
	 * @param map
	 * @return
	 */
	List<OrganizationVo> findOrgListByCodeLike(Map<String, Object> map);
	/**
	 * 下一级列表
	 * @param map
	 * @return
	 */
	List<OrganizationVo> findFirstSubOrgListByParentId(Map<String, Object> map);
	/**
	 * 指定组织是否存在下级组织/项目
	 * @param id
	 * @return
	 */
	List<Team> isExistSub(Integer id);
	/**
	 * 指定组织是否存在关联自建角色
	 * @param id
	 * @return
	 */
	List<Role> isExistRelationRole(Integer id);
	/**
	 * 通用角色中是否存在该组织的用户==过滤该组织对应的负责人
	 * @param paramsMap
	 * @return
	 */
	List<UserTeam> isExistRoleAuth(Map<String, String> paramsMap);
	////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////// 以下是项目模块
	////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * 根据项目名称查询项目信息
	 * @param projectVo
	 * @return
	 */
	ProjectVo findFirstSubProjectByName(ProjectVo projectVo);

	/**
	 * 保存项目基本信息
	 * @param projectVo
	 */
	int addProjectBase(ProjectVo projectVo);

	/**
	 * 更新项目基本信息
	 * @param projectVo
	 * @return
	 */
	int updateProjectBase(ProjectVo projectVo);

	/**
	 * 更新项目状态
	 * @param id
	 * @param status
	 * @return
	 */
	int updateTeamStatusByRoId(@Param("id")Integer id, @Param("status")Integer status);

	/**
	 * 获取项目详情
	 * @param map
	 * @return
	 */
	TeamVo findProjectDeatilById(Map<String, Object> map);

	/**
	 * 获取所有下级项目列表
	 * @param map
	 * @param string
	 * @return
	 */
	List<ProjectVo> findProjectListByCodeLike(Map<String, Object> map);

	/**
	 * 获得parentId对应的项目
	 * @param map
	 * @return
	 */
	List<ProjectVo> findFirstSubProjectListByParentId(Map<String, Object> map);

	/**
	 * 获得组织项目架构图
	 * @return
	 */
	List<OrgAndProjectTreeParam> orgAndProjectTree();

	/**
	 * 获得登录人所在组织下的组织/项目架构图
	 * @param orgId
	 * @return
	 */
	List<OrgAndProjectTreeParam> findAllSubOrgAndProjectByOrgId(int orgId);
	
	/**
	 * 查询当前下级(所有状态： 启用、禁用、删除) 
	 * @param map
	 * @return
	 */
	List<Team> selectFirstAllStatusSubOrgOrProList(Map<String, Object> map);
	/**
	 * 查询对应的负责人/项目经理角色
	 * @param paramsMap
	 * @return
	 */
	Role findManageRole(Map<String, String> paramsMap);
	/**
	 * 查询指定组织关联的角色负责人/项目经理信息
	 * @param paramsMap
	 * @return
	 */
	UserTeam findManagerByRoleIdAndTeamId(Map<String, String> paramsMap);
	/**
	 * 删除指定组织关联的角色负责人/项目经理信息
	 * @param paramsMap
	 * @return
	 */
	int deleteManagerByRoleIdAndTeamId(Map<String, String> paramsMap);
	/**
	 * 删除组织/项目关联用户
	 * @param teamId 组织/项目Id
	 * @return
	 */
	List<UserAccount> isExistUserAccount(String teamId);
	/**
	 * 根据条件选择获得当前及下级的组织还是直接下级
	 * @param paramsMap
	 * @return
	 */
	List<String> selectSubTeam(Map<String, String> paramsMap);
	/**
	 * 查询非组织/项目模块下对应的用户
	 * @param isUniqueManageMap
	 * @return
	 */
	UserTeam findNotManagerByRoleIdAndTeamId(Map<String, String> isUniqueManageMap);


}